[小ネタ] AWS Transfer Family のスコープダウンポリシーでワイルドカードが使えるか試した
はじめに
おはようございます、もきゅりんです。
皆さん、AWS Transfer Family 使ってますか?
自分はしばらく触っていなかったのですが、ちょっと見ないうちに設定項目も変わってどんどん進化しているようでした。
設定も簡潔に、過去に比べて構築もスピーディーに進められるようになったと感じました。
本稿では、VPCに閉じた環境でTransfer Family のSFTPを使ってS3の特定フォルダのワイルドカードを使ってアップロードができるのか試してみました。
そもそもフォルダの階層をうまく整理して利用ができていれば、ワイルドカードを利用する機会もないかもしれませんが、まだ階層を整理しきれていない場合や対応せざるを得ないケースを想定しています。
想定している読者ですが、 AWS Transfer Family がどのようなサービスでどのように使うか、については把握されているとします。
そもそもスコープダウンポリシーとは
SFTP Family にはIAMロールの制御とは別に、ユーザーのアクセスをある一部のホームディレクトリ(バケット/フォルダ)のみに制限できる、スコープダウンポリシー という機能があります。
(各ユーザーの権限をIAMロールで制御することももちろん可能ですが、SFTP Familyで用意したポリシー変数 ${transfer:HomeBucket}
や ${transfer:HomeDirectory}
、${transfer:UserName}
などを使えばこれらの変数をユーザー名やホームディレクトリの適切な値に置き換えてくれるので、柔軟に複数ユーザーで同じポリシードキュメントを使うことができます。つまり、スコープダウンポリシーを使うとユーザーのアクセス管理が楽になります。)
またスコープダウンポリシーとは別に、Restricted のチェックボックスを使ってユーザーがあるフォルダー外部にアクセスしたり、表示できなくなる設定 もあります。スコープダウンポリシーよりも簡単にユーザーのアクセス制御を設定できる機能です。あるフォルダのみにシンプルに限定させたい場合はこの機能で十分かと思います。
Restrictedの機能については、Edit a user's details に記載があります。
構成図
今回の実行してみたい構成としては下図となります。
結論
使えます。
ちなみに、Restricted の設定の場合はワイルドカードは使えません。
やったこと
- スコープダウンポリシーを使ってワイルドカードでフォルダ指定してみる
- Restricted を使ってワイルドカードでフォルダ指定してみる
- スコープダウンポリシーと Restricted を使ってワイルドカードでフォルダ指定してみる
準備
- プライベートサブネットを持つVPC
- SFTPサーバに格納するSSH公開鍵とペアとなる秘密鍵を持つEC2インスタンスを作成
- デフォルト設定のS3バケットを1つ作成
- SFTPサーバのユーザーに設定するためのIAMロールの作成(AmazonS3FullAccessで良いです)
構築
基本的な設定は下記ブログを参照頂けますと幸いですが、変更した点、更新されている箇所、本稿の検証に関係している箇所に焦点を当てて説明を進めます。
AWS SFTPでホームディレクトリの読み書きだけ許可してみた #reinvent
S3の構成としては以下のようになっています。
サーバー作成
コンソールで作ってみました。 本稿ではVPCでサーバを作成します。 Identity providerは、Service managed にしています。
なお、Transfer Family の構成例については下記ブログも参考となります。
AWS Transfer for SFTPの構成例まとめ (2020年4月版)
VPCとサブネットを選びます。
ログ取得設定がデフォルトになったようなので、必要に応じて、こちらに記載されているようなポリシーでロールを作成します。
セキュリティポリシーを選択できますが、コンソールで作成する場合のデフォルトの TransferSecurityPolicy-2020-06
で作成しました。
(APIまたはCLIを使用した場合、TransferSecurityPolicy-2018-11
になることに注意です。2018と2020のセキュリティポリシーの違いは、それぞれサポートされているすべての暗号化アルゴリズムなのか、サポートされていて非推奨ではない暗号化アルゴリズムがすべて含まれているか、です。)
Working with security policies
Server Host Key は、既存のSFTP対応サーバーからユーザーを移行するためのものなので、スルーして、作成します。
(なお、内部アクセスのみのためにVPCで作成されたサーバーは、カスタムホストをサポートしていません。)
しばらく触ってなかったのですが、サーバの起動がめちゃくちゃ早くなってる気がします。(気のせい?)
コンソールから作成したVPCエンドポイントのセキュリティグループが default
なのは要チェックです。そのセキュリティグループが当てられているリソースに対しては全開放となります。利用上、必要最小限の開放とするセキュリティグループを作成して付け替えましょう。
ユーザー作成
ユーザーに当てるIAMポリシー(=スコープダウンポリシー)を作成します。
[ポリシー例][https://docs.aws.amazon.com/transfer/latest/userguide/scope-down-policy.html]
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListingOfUserFolder", "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::${transfer:HomeBucket}" ], "Condition": { "StringLike": { "s3:prefix": [ "${transfer:HomeFolder}/*", "${transfer:HomeFolder}" ] } } }, { "Sid": "HomeDirObjectAccess", "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:DeleteObjectVersion", "s3:DeleteObject", "s3:GetObjectVersion" ], "Resource": "arn:aws:s3:::${transfer:HomeDirectory}*" } ] }
ちなみに、HomeDirectory
と HomeFolder
の違いって何?と思ったわけですが、HomeDirectory
は バケット名を含んだホームディレクトリ 、HomeFolder
は バケットのから下のフォルダが対象となります。
hogehogeユーザーを作ります。
検証
VPCエンドポイントに対してEC2からsftpで接続します。
sftp -i private-key [email protected]
ちなみに、自分のローカル端末のdigコマンドでもこのVPCエンドポイントは名前解決をしてくれます。なので、Direct Connect経由のオンプレ側からの名前解決も特にDNSサーバの構築やRoute 53 Resolver for Hybrid Clouds を考慮せず安心して利用ができますね。
dig vpce-xxxxx-ap-northeast-1.vpce.amazonaws.com ; <<>> DiG 9.10.6 <<>> vpce-xxxxx-ap-northeast-1.vpce.amazonaws.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29076 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1280 ;; QUESTION SECTION: ;vpce-xxxxx-ap-northeast-1.vpce.amazonaws.com. IN A ;; ANSWER SECTION: vpce-xxxxx-ap-northeast-1.vpce.amazonaws.com. 60 IN A 10.0.10.99 ...
で、hogehoge-action-plansへのアップロードすると問題なくOK。
sftp> put hoge.txt /BUCKET_NAME/hogehoge-action-plans Uploading hoge.txt to /BUCKET_NAME/hogehoge-action-plans/hoge.txt hoge.txt 100% 0 0.0KB/s 00:00
hogehoge-action-resultsへのアップロードもOK。
sftp> put hoge.txt /BUCKET_NAME/hogehoge-action-results Uploading hoge.txt to /BUCKET_NAME/hogehoge-action-results/hoge.txt hoge.txt 100% 0 0.0KB/s 00:00
hogehoge-action-resultsへのアップロードはダメ。
sftp> put hoge.txt /BUCKET_NAME/hogehoge-schedule-plans Uploading hoge.txt to /BUCKET_NAME/hogehoge-schedule-plans hoge.txt 100% 0 0.0KB/s 00:00 Couldn't close file: Permission denied
じゃ特に指定しないとどうなりますか?
sftp> put hoge.txt Uploading hoge.txt to /BUCKET_NAME/hogehoge-action-*/hoge.txt hoge.txt 100% 0 0.0KB/s 00:00
オブジェクトが作成されて、その配下にファイルが転送されます。
今度は Restricted でユーザのホームディレクトリをワイルドカードで制限してみます。
sftp> put hogehoo.txt Uploading hogehoo.txt to /hogehoo.txt hogehoo.txt 100% 0 0.0KB/s 00:00
結果としては、hogehoge-action-* 配下に hogehoo.txt が出来上がりました。
さらに
put hoge.txt /demo-moqrin-bucket/hogehoge-action-results
hogehoge-action-*/demo-moqrin-bucket/ 配下に hogehoo.txt が出来上がりました。
ちなみに、スコープダウンポリシーと Restricted の両方設定すると、Failed to create user (${transfer:Home*} variable used in policy for a user with a logical home directory)
というエラーが出てユーザ作成ができませんでした。
より細かく制御したいならスコープダウンポリシーを使え、と書いてあったけど同時に使うとエラー出るのですね。
When assigning the user a home directory and restricting the user to that home directory, this should be sufficient enough to lock down the user's access to the designated folder. Use a scope-down policy when you need to apply further controls.
結論
やってみた結果としては以下です。
- AWS Transfer Family のスコープダウンポリシーでワイルドカードは使えました。
-
Restricted の設定ではワイルドカードを使えませんでした。
-
スコープダウンポリシー と Restricted を両方設定するとユーザー登録できない
以上です。
最後に
最初はIAMロールで設定しないとダメなのかな?と思ってましたが、スコープダウンポリシーでワイルドカードでのフォルダ指定できました。
実際に利用する機会があるかどうかは別として、ポリシー変数をうまく利用するとより細かな制御できそうだな、と感じました。
どなたかのお役に立てば幸いです。